/**
 * @Author: 27
 * @Date: 2023/01/07 21:09:05
 * @LastEditors: 27
 * @Description: 后端服务
 * @FilePath: /Go/backend/app/admin/admin.go
 */
package admin

import (
	"fmt"
	"sync"

	"learning.com/edu/utils/jsonlog"
)

type Admin struct {
    logger *jsonlog.Logger
    wg     *sync.WaitGroup
}

func New(logger *jsonlog.Logger) *Admin {
    return &Admin{
        logger: logger,
        wg:     &sync.WaitGroup{},
    }
}

// 添加一个待执行的函数并以 goroutine 方式运行，同时提供了并发控制和错误恢复机制
func (a *Admin) Add(fn func()) {
    //使用a.wg.Add(1)增加等待组(WaitGroup)计数,用于跟踪 goroutine
    // 在 goroutine 内部通过defer a.wg.Done()确保计数最终会减少，避免死锁
    a.wg.Add(1)
    //通过go func(){...}启动一个匿名 goroutine 来异步执行任务
    // 但注意当前代码中并没有实际调用传入的fn函数,这可能是个遗漏
    go func() {
        // 确保 goroutine 结束时调用 a.wg.Done()
        defer a.wg.Done()
        //使用defer结合recover()捕获 goroutine 中可能发生的 panic
        //若发生 panic，会将错误信息通过a.logger.Error记录日志
        defer func() {
            if err := recover(); err != nil {
                a.logger.Error(fmt.Errorf("%s", err), nil)
            }
        }()

        fn()
    }()
}

// 等待所有 goroutine 执行完毕
func (a *Admin) Wait() {
    a.wg.Wait()
}